关于代码控制屏幕方向

context

今天同学提了一个需求,希望在 NavigationController管理的控制器中,实现 Push出的控制器是横屏,然后前一个控制器是竖屏的.

听到这么说, 很简单的想到使用代码控制器屏幕方向,(当然,需要首先在项目的 plist中允许屏幕的多个方向)

尝试

经过查找相关资料, 锁定了三个方法:

1
2
3
4
5
6
7
8
9
10
11
-(BOOL)shouldAutorotate{
return NO;
}

-(NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}

-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
return UIInterfaceOrientationPortrait;
}
  • 第一个方法: 允许自动旋转 ,返回 NO

  • 第二个方法: 当前屏幕支持的方向,默认是 UIInterfaceOrientationMaskAll ,即支持所有在Xcode工程中标注的方向.在这返回竖屏,意为让其竖屏显示

  • 第三个方法: 当控制器推出方法是Present的时候,优先选择的方向,注意,这个只是优先选择的方向, 当显示完毕,用户继续旋转手机的时候,还是会自动根据用户手机方向进行变化的.

方法准备完毕, 但是当用在同学的需求上时候,发现根本不起作用 .前一个控制器的状态,会影响后面的控制器.

后来查找相关资料, 虽然原因没找到, 但是大家都是遇到了这个问题.

个人猜想是,NavigationController是全局的容器,控制器本身并不能影响它的行为.

验证

继承系统的NavgationController ,添加以下方法:

1
2
3
4
5
6
7
-(BOOL)shouldAutorotate{
return NO;
}

-(NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}

旋屏屏幕, 发现在 Xcode中设置的屏幕方向没用了,现在只能是竖屏.

妥协

鉴于上面遇到的坑, 所以更改推出控制器的方式为 Present ,即让控制器脱离NavigationController的管理 ,就像咱播放视频的时候, 视频自动横屏, 但是不是在Navigation的管理下.